/*
有些时候可以用空间换时间
一个正整数的阶乘（factorial）是所有小于及等于该数的正整数的积，并且0的阶乘为1
*/
const factorial = function f(num) {
  if (num === 1) {
    return 1
  } else {
    return (num * f(num - 1))
  }
}

const proxy = function (fn) {
  const cache = {}  // 缓存对象
  return function (this: any, num) {
    if (num in cache) {
      return cache[num]   // 使用缓存代理
    }
    return cache[num] = fn.call(this, num)
  }
}

const proxyFactorial = proxy(factorial)
console.log(proxyFactorial(5))
console.log(proxyFactorial(5))
console.log(proxyFactorial(5))
